#include "sauvegarde.h"
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include "assert.h"
using namespace std;

void creerSauvegarde(jeu* j,const char filenameHero[],const char filenameNiv[],const char filenameArme[],const char filenameMonstre[])
{
    creerSauvegardeHero(jeuGetHero(j),filenameHero);///sauvegarde le hero
    creerSauvegardeListeNiveau(jeuGetListeNiveau(j),filenameNiv);///sauvegarde les niveaux
    creerSauvegardeTabArme(j->tarme,filenameArme);///sauvegarde les armes
    creerSauvegardeTabMonstre(j->tmon,filenameMonstre);///sauvegarde les monstres
}

void creerSauvegardeHero(Hero* h,const char filename[])
{
    FILE* fh;///fichier pour le hero
    fh=fopen(filename,"w");/// ceation d'un fichier pr sauvegarder le hero

    if(fh==NULL)	///test usuel de l'ouverture du fichier du hero
              {
                         printf("ERREUR dans l'ouverture du fichier");
                         assert(fh);	///arrete la fonction si erreur
              }

    /// recup des info sur le hero
    fprintf(fh,"\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d",heroGetX(h),heroGetY(h),heroGetniveau(h),heroGetterrain(h),armeGetId(heroGetarme(h)),heroGetvie(h),heroGetScore(h),heroGetpv(h));
    fclose(fh);	///on ferme le fichier du hero

}

void creerSauvegardeTerrain(Terrain* t,const char filename[])
{
    FILE* ft;
    int i,j;
    ft=fopen(filename,"a");/// ceation d'un fichier pr sauvegarder le terrain

    if(ft==NULL)	///test usuel de l'ouverture du fichier du terrain
              {
                         printf("ERREUR dans l'ouverture du fichier");
                         assert(ft);	///arrete la fonction si erreur
              }

    fprintf(ft,"%d\n%d\n",terrainGetDimX(t),terrainGetDimY(t));/// ecrit la dimx et dimy du terrain
    for(j=0;j<terrainGetDimY(t);j++)
        {
                                for(i=0;i<terrainGetDimX(t);i++)
                                {
                                    fprintf(ft,"%c",terrainGetTer(t,i,j));/// ecrit le tableau de caractere du terrain
                                }
                                fprintf(ft,"\n");
        }
    fclose(ft);	///on ferme le fichier du terrain
}

void creerSauvegardeElementNiveau(element_niveau* en,int nbrTerrain,const char filename[])
{
    FILE* fen;
    fen=fopen(filename,"a");/// ceation d'un fichier pr sauvegarder les elements d'un niveau
    if(fen==NULL)	///test usuel de l'ouverture du fichier du terrain
              {
                         printf("ERREUR dans l'ouverture du fichier");
                         assert(fen);	///arrete la fonction si erreur
              }

    fprintf(fen,"%d\n",elementNiveauGetNumTer(en));///ecrit le numero du terrain
    fclose(fen);///on ferme le fichier
    creerSauvegardeTerrain(elementNiveauGetTerrain(en),filename);/// ecrit les info du terrain

    if(nbrTerrain>1)
    {
        nbrTerrain--;
        creerSauvegardeElementNiveau(en->suivant,nbrTerrain,filename);///permet d'ecrire tous les terrains
    }
}

void creerSauvegardeNiveau(Niveau* n,int nbrNiv,const char filename[])
{
    FILE* fn;
    fn=fopen(filename,"a");/// ceation d'un fichier pr sauvegarder un niveau
    if(fn==NULL)	///test usuel de l'ouverture du fichier du terrain
              {
                         printf("ERREUR dans l'ouverture du fichier");
                         assert(fn);	///arrete la fonction si erreur
              }

    fprintf(fn,"%d\n",nivGetNumero(n));/// ecrit le numero du niveau
    fprintf(fn,"%d\n",nivGetNbrTerrain(n));/// ecrit le nombre de terrain
    /// ecrit tous les terrains du niveau
    fclose(fn);    ///on ferme le fichier
    creerSauvegardeElementNiveau(nivGetElementNiveau(n),nivGetNbrTerrain(n),filename);

    if(nbrNiv>1)
    {
        nbrNiv--;
        creerSauvegardeNiveau(n->suivant,nbrNiv,filename);
    }
}

void creerSauvegardeListeNiveau(liste_niveau* ln,const char filename[])
{
    FILE* fln;
    fln=fopen(filename,"w");/// ceation d'un fichier pr sauvegarder un niveau
    if(fln==NULL)	///test usuel de l'ouverture du fichier du terrain
              {
                         printf("ERREUR dans l'ouverture du fichier");
                         assert(fln);	///arrete la fonction si erreur
              }

    fprintf(fln,"\n%d\n",ListeNiveauGetNbrNiveau(ln));///ecrit le nombre de niveau du jeu
    fclose(fln);///on ferme le fichier
    creerSauvegardeNiveau(ListeNiveauGetNiveau(ln),ListeNiveauGetNbrNiveau(ln),filename);

}

void creerSauvegardeArme(arme* a,const char filename[])
{

    FILE* fa;
    fa=fopen(filename,"a");/// creation d'un fichier pr sauvegarder

    if(fa==NULL)	///test usuel de l'ouverture du fichier
              {
                         printf("ERREUR dans l'ouverture du fichier");
                         assert(fa);	///arrete la fonction si erreur
              }

    fprintf(fa,"%d\n%d\n%d\n",armeGetId(a),armeGetDegat(a),armeGetDebloque(a));/// ecrit l'id, les degats et le blocage de l'arme
    fclose(fa);	///on ferme le fichier
}

void creerSauvegardeTabArme(tableau_arme* Ta,const char filename[])
{
    FILE* fta;
    int i;
    fta=fopen(filename,"w");/// ceation d'un fichier pr sauvegarder
    if(fta==NULL)	///test usuel de l'ouverture du fichier
              {
                         printf("ERREUR dans l'ouverture du fichier");
                         assert(fta);	///arrete la fonction si erreur
              }

    fprintf(fta,"\n%d\n%d\n",tabArmeGetNbPos(Ta),tabArmeGetNbArme(Ta));///ecrit la taille du tableau d'arme et du nbre d'arme
    fclose(fta);///on ferme le fichier
    for(i=0;i<tabArmeGetNbArme(Ta);i++)
    {
        creerSauvegardeArme(tabArmeGetArme(&Ta[i]),filename);
    }
}

void creerSauvegardeMonstre(monstre* m,const char filename[])
{
     FILE* fm;
    fm=fopen(filename,"a");/// creation d'un fichier pr sauvegarder

    if(fm==NULL)	///test usuel de l'ouverture du fichier
              {
                         printf("ERREUR dans l'ouverture du fichier");
                         assert(fm);	///arrete la fonction si erreur
              }

    ///ecrit le numero,la direction, le type,la position et la vie du monstre
    fprintf(fm,"%d\n%c\n%d\n%d\n%d\n%d\n%d\n%d\n",monstreGetNum(m),monstreGetDirection(m),monstreGetType(m),monstreGetX(m),monstreGetY(m),monstreGetNiv(m),monstreGetTer(m),monstreGetVie(m));
    fclose(fm);	///on ferme le fichier
}

void creerSauvegardeTabMonstre(tableau_monstre* Tm,const char filename[])
{
    FILE* ftm;
    int i;
    ftm=fopen(filename,"w");/// ceation d'un fichier pr sauvegarder
    if(ftm==NULL)	///test usuel de l'ouverture du fichier
              {
                         printf("ERREUR dans l'ouverture du fichier");
                         assert(ftm);	///arrete la fonction si erreur
              }

    fprintf(ftm,"\n%d\n%d\n",tabMonstreGetNbPossible(Tm),tabMonstreGetNbMonstre(Tm));///ecrit la taille du tableau de monstres et le nbre de monstres
    fclose(ftm);///on ferme le fichier
    for(i=0;i<tabMonstreGetNbMonstre(Tm);i++)
    {
        creerSauvegardeMonstre(tabMonstreGetMonstre(&Tm[i]),filename);
    }
}

void chargerSauvegarde(const char filenameHero[],const char filenameNiv[],const char filenameArme[],const char filenameMonstre[],jeu* j)
{
    FILE* s;
    char chaine[20];
    int x,y,niv,id,vie,sc,pv,ter;
    arme* a;
    a= new(arme);
    s=fopen(filenameHero,"r");/// ouverture du fichier de sauvegarde
    if(s==NULL)	///test usuel de l'ouverture du fichier
              {
                         printf("ERREUR dans l'ouverture du fichier");
                         assert(s);	///arrete la fonction si erreur
              }
    fgets(chaine,20,s);	///on saute la premiere ligne
    fscanf(s,"%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d",&x,&y,&niv,&ter,&id,&vie,&sc,&pv);/// recup des info du hero
    a=rechercheArme(jeuGetTableauArme(j),id);/// recherche l'arme utilisée par le hero
    jeuSetHero(j,creerHero(x,y,niv,vie,a));/// creation d'un hero avec les info du fichier de sauvegarde
    heroSetScore(jeuGetHero(j),sc);///met le score a jour
    heroSetpv(jeuGetHero(j),pv);
    heroSetterrain(jeuGetHero(j),ter);
    fclose(s);	///on ferme le fichier

    jeuSetListeNiveau(j,creerListeNiveauFichier(filenameNiv));///charge les niveaux
    jeuSetTableauArme(j,creerTabArme(filenameArme));///charge les armes
    jeuSetTableauMonstre(j,creerTableauMonstre(filenameMonstre));///charge les monstres
}

